﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace Tecnosop.Dominio.Validadores
{
    public class RutValidatorAttribute : ValidationAttribute, IClientValidatable
    {
        private bool isNullable;

        public RutValidatorAttribute(bool Nullable = false)
        {
            this.isNullable = Nullable;
        }

        public override bool IsValid(object value)
        {
            string rut = value as string;

            //if (rut != null)
            if (!String.IsNullOrEmpty(rut))
            {
                string[] r = rut.Split('-');
                int rutInt;
                return Int32.TryParse(r[0], out rutInt) ? r[1] == digitoVerificador(rutInt) : false;
            }
            else
            {
                return this.isNullable;
            }
        }

        private string digitoVerificador(int rut)
        {
            int Digito;
            int Contador;
            int Multiplo;
            int Acumulador;
            string RutDigito;

            Contador = 2;
            Acumulador = 0;

            while (rut != 0)
            {
                Multiplo = (rut % 10) * Contador;
                Acumulador = Acumulador + Multiplo;
                rut = rut / 10;
                Contador = Contador + 1;
                if (Contador == 8)
                {
                    Contador = 2;
                }

            }

            Digito = 11 - (Acumulador % 11);
            RutDigito = Digito.ToString().Trim();
            if (Digito == 10)
            {
                RutDigito = "k";
            }
            if (Digito == 11)
            {
                RutDigito = "0";
            }
            return (RutDigito);
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            yield return new ModelClientValidationRutValidatorRule(this.ErrorMessageString);
        }
    }

    public class ModelClientValidationRutValidatorRule : ModelClientValidationRule
    {
        public ModelClientValidationRutValidatorRule(string errorMessage) : base()
        {
            this.ErrorMessage = errorMessage;
            this.ValidationType = "rut";
        }
    }
}